package com.dy.design_pattern_study.store_cashier_system;

import com.dy.design_pattern_study.store_cashier_system.factory.CashSuper;
import com.dy.design_pattern_study.store_cashier_system.factory.impl.CashNormal;
import com.dy.design_pattern_study.store_cashier_system.factory.impl.CashRebate;
import com.dy.design_pattern_study.store_cashier_system.factory.impl.CashReturn;

import java.util.Scanner;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-03-07
 * @Content 现金收费工厂类
 * 什么是简单工厂模式？
 * 简单工厂模式就是
 * 有一个工厂接口，这个工厂可以根据不同的参数来返回不同的对象来实现用户想要的效果
 * <p>
 * 一个接口 CashSuper -多个实现 CashNormal CashRebate CashReturn
 * 工厂调用 CashFactory.createCashAccept(inType) -多态返回
 * 简单工厂模式 模式只是解决对象的创建问题
 * 因此 其 又称 创建型模式 or 静态工厂模式
 * 作用：由一个工厂对象决定创建出哪一种产品类的实例
 * 优点：解耦、用户不必需要管理类的创建
 * 缺点：它所能创建的类只能是事先考虑到的，如果需要添加新的类，则就需要改变工厂类了。
 */
public class CashFactory {
    public static final String NORMAL_CHARGE = "正常收费";
    public static final String RETURN_MONEY = "满300返100";
    public static final String REBATE_MONEY = "打8折";

    public static String showType;

    //工厂模式的前台
    public static void main(String[] args) {

        System.out.println("*********** 欢迎进入 超市收银系统 ***********");

        System.out.println("1." + NORMAL_CHARGE);
        System.out.println("2." + RETURN_MONEY);
        System.out.println("3." + REBATE_MONEY);

        //这里是简单工厂模式 -很明显这个简单工厂是无法解决超市收银系统的 折扣问题
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请选择对应的收费活动：");

            int inType = scanner.nextInt();
            //创建一个工厂
            CashSuper cashSuper = CashFactory.createCashAccept(inType);

            System.out.println("请输入商品价格：");
            double price = scanner.nextDouble();

            System.out.println("请输入商品数量：");
            double number = scanner.nextInt();
            double totalPrices = price * number;
            //设置对应功能类型 -简单工厂就会返回需要的数据
            double acceptCashPrice = cashSuper.acceptCash(totalPrices);

            System.out.println("操作： " + showType);
            System.out.println("单价 = " + price);
            System.out.println("总价 = " + acceptCashPrice);
            //可以把数据添加到一个集合就可以进行多次显示

            System.out.println("是否继续输入？Y/N");
            String conti = scanner.next();

            if (conti.equalsIgnoreCase("N")) {
                scanner.close();
                break;
            }
        }
    }


    //现金收费工厂
    public static CashSuper createCashAccept(int type) {
        //工厂模式 就是传入不同的参数，可以创建不同的对象
        CashSuper cs = null;
        switch (type) {
            case 1:
                cs = new CashNormal();
                showType = NORMAL_CHARGE;
                break;
            case 2:
                cs = new CashReturn("300", "100");
                showType = RETURN_MONEY;
                break;
            case 3:
                cs = new CashRebate("0.8");
                showType = REBATE_MONEY;
                break;
        }
        return cs;
    }
}
